export interface ClassifyStringResult<S> {
	/** 分类标题 */
	title: any[];
	/** 分类的数据 */
	data: S[];
}

export interface ClassifyResult<T, S> {
	/** 分类标题 */
	title: T;
	/** 分类的数据 */
	data: S[];
}

export default class MyArray {

	/**
	 * 分类
	 * @param data 被分类的数据
	 * @param getTitle 获取分类数据
	 * @param decide 判断分类的条件
	 */
	public static Classify<T, S>(
		data: S[],
		getTitle: (row: S) => T,
		decide: (titleA: T, titleB: T) => boolean
	): ClassifyResult<T, S>[] {
		const ret: ClassifyResult<T, S>[] = [];
		for (const row of data) {
			const titleB: any = getTitle(row);
			let obj: ClassifyResult<T, S> | undefined = ret.find(({ title: titleA }) => decide(titleA, titleB));
			if (!obj) {
				ret.push((obj = { title: titleB, data: [] }));
			}
			obj.data.push(row);
		}
		return ret;
	}

	/**
	 * 按标题数组分类
	 * @param data 被分类的数据
	 * @param titleList 用来分类的标题
	 */
	public static ClassifyString<S>(data: S[], titleList: (keyof S)[]): ClassifyStringResult<S>[] {
		const ret: ClassifyStringResult<S>[] = [];
		for (const row of data) {
			const titleB: any[] = titleList.map(item => row[item]);
			let obj: ClassifyStringResult<S> | undefined = ret.find(({ title: titleA }) =>
				titleList.every((title, index) => titleA[index] === titleB[index])
			);
			if (!obj) {
				ret.push((obj = { title: titleB, data: [] }));
			}
			obj.data.push(row);
		}
		return ret;
	}

	/**
	 * 排序内容
	 * @param data 被排序的顺序
	 * @param list 排序的顺序
	 */
	public static SortByArray<S = any>(data: S[], list: any[]): S[] {
		return data.sort((x, y) => list.indexOf(x) - list.indexOf(y));
	}

	/**
	 * 数组删重
	 * @param arr 被删重的数组
	 */
	static del_repeat(arr: any[]) {
		return Array.from(new Set(arr));
	}

	/**
	 * 分割
	 * @param data 被分割的数据
	 * @param len 分割的长度
	 */
	public static split<S = any>(data: S[], len: number): S[][] {
		const ret: S[][] = [];
		const max = data.length;
		const count = max / len;
		for (var i = 0; i < count; i++) {
			ret.push(data.slice(i * len, i + 1 == count ? max : (i + 1) * len));
		}
		return ret;
	}

	/**
	 * 取最后一位
	 * @param data 数据
	 */
	public static last<S = any>(data: S[]): S {
		return data[data.length - 1];
	}

	/**
	 * 排序分类数据
	 * @param data 要排序的分类数据
	 * @param index 排序数据的序号
	 * @param list 排序数据的顺序
	 */
	public static SortClassifyByArray<S>(data: ClassifyStringResult<S>[], index: number, list: any[]): ClassifyStringResult<S>[] {
		return data.sort(
			(x, y) => list.indexOf(x.title[index]) - list.indexOf(y.title[index])
		);
	}
}
